{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3641f07dfd07df7c",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "# Kaggle自行车租赁预测比赛\n",
    "Kaggle中最有名的例子是[泰坦尼克号之灾](https://www.kaggle.com/c/titanic)的例子，因为数据量小，同时趣味性很浓。我之前写过一篇博客[逻辑回归应用之Kaggle泰坦尼克之灾](http://blog.csdn.net/han_xiaoyang/article/details/49797143)，介绍了一下逻辑斯特回归在这样一个分类问题上的应用，以及，一个完整的机器学习是什么样的。<br><br>\n",
    "这里的[Kaggle自行车租赁预测比赛](https://www.kaggle.com/c/bike-sharing-demand)也同样是一个很有趣的问题，之所以要把它单拎出来，讲一讲，2个原因和[泰坦尼克号之灾](https://www.kaggle.com/c/titanic)是一样的，另外一个原因是，这是一个连续值预测的问题，也就是我们说的机器学习中的回归问题，本着各类问题我们都要覆盖一下的标准，咱们一起来看看这个问题。<br><br>\n",
    "这是一个城市自行车租赁系统，提供的数据为2年内华盛顿按小时记录的自行车租赁数据，其中训练集由每个月的前19天组成，测试集由20号之后的时间组成（需要我们自己去预测）。 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "efac1c9bf7b994ea",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "source": [
    "# 数据分析和预分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "93ffce8e8c99f9b6",
   "metadata": {
    "collapsed": false,
    "is_executing": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "724cbc3805532eb",
   "metadata": {
    "collapsed": false,
    "is_executing": true,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [],
   "source": [
    "df_train = pd.read_csv('Kaggle_bike_competition_train.csv',header=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "778e28e9e1f6435f",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>datetime</th>\n",
       "      <th>season</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weather</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>humidity</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2011-01-01 00:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>81</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2011-01-01 01:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.02</td>\n",
       "      <td>13.635</td>\n",
       "      <td>80</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>32</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2011-01-01 02:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.02</td>\n",
       "      <td>13.635</td>\n",
       "      <td>80</td>\n",
       "      <td>0.0</td>\n",
       "      <td>5</td>\n",
       "      <td>27</td>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2011-01-01 03:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>75</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>10</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2011-01-01 04:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>75</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              datetime  season  holiday  workingday  weather  temp   atemp  \\\n",
       "0  2011-01-01 00:00:00       1        0           0        1  9.84  14.395   \n",
       "1  2011-01-01 01:00:00       1        0           0        1  9.02  13.635   \n",
       "2  2011-01-01 02:00:00       1        0           0        1  9.02  13.635   \n",
       "3  2011-01-01 03:00:00       1        0           0        1  9.84  14.395   \n",
       "4  2011-01-01 04:00:00       1        0           0        1  9.84  14.395   \n",
       "\n",
       "   humidity  windspeed  casual  registered  count  \n",
       "0        81        0.0       3          13     16  \n",
       "1        80        0.0       8          32     40  \n",
       "2        80        0.0       5          27     32  \n",
       "3        75        0.0       3          10     13  \n",
       "4        75        0.0       0           1      1  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "aa0b497e-e771-46ae-9d63-4ceb6d7eed23",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 10886 entries, 0 to 10885\n",
      "Data columns (total 12 columns):\n",
      " #   Column      Non-Null Count  Dtype  \n",
      "---  ------      --------------  -----  \n",
      " 0   datetime    10886 non-null  object \n",
      " 1   season      10886 non-null  int64  \n",
      " 2   holiday     10886 non-null  int64  \n",
      " 3   workingday  10886 non-null  int64  \n",
      " 4   weather     10886 non-null  int64  \n",
      " 5   temp        10886 non-null  float64\n",
      " 6   atemp       10886 non-null  float64\n",
      " 7   humidity    10886 non-null  int64  \n",
      " 8   windspeed   10886 non-null  float64\n",
      " 9   casual      10886 non-null  int64  \n",
      " 10  registered  10886 non-null  int64  \n",
      " 11  count       10886 non-null  int64  \n",
      "dtypes: float64(3), int64(8), object(1)\n",
      "memory usage: 1020.7+ KB\n"
     ]
    }
   ],
   "source": [
    "df_train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b6997d37-b571-406b-892a-3e05f7862a8e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10886, 12)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "cacb8e87-61fc-4acb-8f75-4dbcf2670e14",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 处理月、日和小时 单独形成列，方便处理\n",
    "df_train['month'] = pd.DatetimeIndex(df_train.datetime).month\n",
    "df_train['day'] = pd.DatetimeIndex(df_train.datetime).day\n",
    "df_train['hour'] = pd.DatetimeIndex(df_train.datetime).hour"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "96963390-a68a-46a7-8094-5bb2dcbccd1d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>datetime</th>\n",
       "      <th>season</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weather</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>humidity</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>count</th>\n",
       "      <th>month</th>\n",
       "      <th>day</th>\n",
       "      <th>hour</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2011-01-01 00:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>81</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>16</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2011-01-01 01:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.02</td>\n",
       "      <td>13.635</td>\n",
       "      <td>80</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>8</td>\n",
       "      <td>32</td>\n",
       "      <td>40</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2011-01-01 02:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.02</td>\n",
       "      <td>13.635</td>\n",
       "      <td>80</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>5</td>\n",
       "      <td>27</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2011-01-01 03:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>75</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>3</td>\n",
       "      <td>10</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2011-01-01 04:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>75</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2011-01-01 05:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>9.84</td>\n",
       "      <td>12.880</td>\n",
       "      <td>75</td>\n",
       "      <td>6.0032</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2011-01-01 06:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.02</td>\n",
       "      <td>13.635</td>\n",
       "      <td>80</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2011-01-01 07:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>8.20</td>\n",
       "      <td>12.880</td>\n",
       "      <td>86</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>2011-01-01 08:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>75</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2011-01-01 09:00:00</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>13.12</td>\n",
       "      <td>17.425</td>\n",
       "      <td>76</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>8</td>\n",
       "      <td>6</td>\n",
       "      <td>14</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              datetime  season  holiday  workingday  weather   temp   atemp  \\\n",
       "0  2011-01-01 00:00:00       1        0           0        1   9.84  14.395   \n",
       "1  2011-01-01 01:00:00       1        0           0        1   9.02  13.635   \n",
       "2  2011-01-01 02:00:00       1        0           0        1   9.02  13.635   \n",
       "3  2011-01-01 03:00:00       1        0           0        1   9.84  14.395   \n",
       "4  2011-01-01 04:00:00       1        0           0        1   9.84  14.395   \n",
       "5  2011-01-01 05:00:00       1        0           0        2   9.84  12.880   \n",
       "6  2011-01-01 06:00:00       1        0           0        1   9.02  13.635   \n",
       "7  2011-01-01 07:00:00       1        0           0        1   8.20  12.880   \n",
       "8  2011-01-01 08:00:00       1        0           0        1   9.84  14.395   \n",
       "9  2011-01-01 09:00:00       1        0           0        1  13.12  17.425   \n",
       "\n",
       "   humidity  windspeed  casual  registered  count  month  day  hour  \n",
       "0        81     0.0000       3          13     16      1    1     0  \n",
       "1        80     0.0000       8          32     40      1    1     1  \n",
       "2        80     0.0000       5          27     32      1    1     2  \n",
       "3        75     0.0000       3          10     13      1    1     3  \n",
       "4        75     0.0000       0           1      1      1    1     4  \n",
       "5        75     6.0032       0           1      1      1    1     5  \n",
       "6        80     0.0000       2           0      2      1    1     6  \n",
       "7        86     0.0000       1           2      3      1    1     7  \n",
       "8        75     0.0000       1           7      8      1    1     8  \n",
       "9        76     0.0000       8           6     14      1    1     9  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b646a6d7-0e20-4e6e-8ca8-7bca1b9f1e4c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 删除不要的字段\n",
    "df_train_origin = df_train\n",
    "df_train = df_train.drop(['datetime','casual','registered'],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a104406a-98c5-4d8a-b79c-2b8f7ec7d0e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>season</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weather</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>humidity</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>count</th>\n",
       "      <th>month</th>\n",
       "      <th>day</th>\n",
       "      <th>hour</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>81</td>\n",
       "      <td>0.0</td>\n",
       "      <td>16</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.02</td>\n",
       "      <td>13.635</td>\n",
       "      <td>80</td>\n",
       "      <td>0.0</td>\n",
       "      <td>40</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.02</td>\n",
       "      <td>13.635</td>\n",
       "      <td>80</td>\n",
       "      <td>0.0</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>75</td>\n",
       "      <td>0.0</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>9.84</td>\n",
       "      <td>14.395</td>\n",
       "      <td>75</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   season  holiday  workingday  weather  temp   atemp  humidity  windspeed  \\\n",
       "0       1        0           0        1  9.84  14.395        81        0.0   \n",
       "1       1        0           0        1  9.02  13.635        80        0.0   \n",
       "2       1        0           0        1  9.02  13.635        80        0.0   \n",
       "3       1        0           0        1  9.84  14.395        75        0.0   \n",
       "4       1        0           0        1  9.84  14.395        75        0.0   \n",
       "\n",
       "   count  month  day  hour  \n",
       "0     16      1    1     0  \n",
       "1     40      1    1     1  \n",
       "2     32      1    1     2  \n",
       "3     13      1    1     3  \n",
       "4      1      1    1     4  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "2e29532c-8a13-4333-91f1-0967f21eddc5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10886, 12)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1af1fed5-70c1-49da-b26e-fca9b1645aa6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10886, 11) (10886,)\n"
     ]
    }
   ],
   "source": [
    "# 特征值和目标值\n",
    "df_train_target = df_train['count'].values\n",
    "df_train_data = df_train.drop(['count'],axis=1).values\n",
    "print(df_train_data.shape,df_train_target.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff17ed41-bb7e-4972-a2b8-8fa7f309a311",
   "metadata": {},
   "source": [
    "# 进入机器学习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "60063829-97b0-4217-be81-0e21852ee2a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import linear_model\n",
    "from sklearn.model_selection import ShuffleSplit  # 修正了拼写错误 'cross_vaildation' -> 'cross_val_score'\n",
    "from sklearn import svm\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.model_selection import learning_curve  # 修正了模块名 'learing_curve' -> 'learning_curve' 和拼写错误 'sklear' -> 'sklearn'\n",
    "from sklearn.model_selection import GridSearchCV  # 修正了模块路径 'grid_search' -> 'model_selection' 和拼写错误 'GridSeacrhCV' -> 'GridSearchCV'\n",
    "from sklearn.metrics import explained_variance_score\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f45a2378-9818-44c3-a46d-06e52f2785f3",
   "metadata": {},
   "source": [
    "# 初步选择模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "d91c1a55-5027-4e36-9aea-c170828a5de1",
   "metadata": {},
   "outputs": [],
   "source": [
    "cv = ShuffleSplit(n_splits=3, test_size=0.2, random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "8eecb3d4-40c3-4a45-b296-2d1ae1a59b66",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "岭回归 -> 训练集得分: 0.3390, 测试集得分: 0.3319\n",
      "支持向量回归 -> 训练集得分: 0.4719, 测试集得分: 0.4556\n",
      "随机森林 -> 训练集得分: 0.9813, 测试集得分: 0.8615\n",
      "---------------------------------------\n",
      "岭回归 -> 训练集得分: 0.3300, 测试集得分: 0.3693\n",
      "支持向量回归 -> 训练集得分: 0.4588, 测试集得分: 0.4962\n",
      "随机森林 -> 训练集得分: 0.9816, 测试集得分: 0.8791\n",
      "---------------------------------------\n",
      "岭回归 -> 训练集得分: 0.3420, 测试集得分: 0.3199\n",
      "支持向量回归 -> 训练集得分: 0.4717, 测试集得分: 0.4358\n",
      "随机森林 -> 训练集得分: 0.9815, 测试集得分: 0.8680\n",
      "---------------------------------------\n"
     ]
    }
   ],
   "source": [
    "for train_index,test_index in cv.split(df_train_data):\n",
    "    X_train, X_test = df_train_data[train_index], df_train_data[test_index]\n",
    "    y_train, y_test = df_train_target[train_index], df_train_target[test_index]\n",
    "    model_list = {\n",
    "    '岭回归': (linear_model.Ridge, {}),\n",
    "    '支持向量回归': (svm.SVR, {'kernel': 'rbf', 'C': 100, 'gamma': 0.001}),\n",
    "    '随机森林': (RandomForestRegressor, {'n_estimators': 100})\n",
    "    }\n",
    "    \n",
    "    for name, (ModelClass, params) in model_list.items():\n",
    "        model = ModelClass(**params)\n",
    "        model.fit(X_train, y_train)\n",
    "        train_score = model.score(X_train, y_train)\n",
    "        test_score = model.score(X_test, y_test)\n",
    "        print(f\"{name} -> 训练集得分: {train_score:.4f}, 测试集得分: {test_score:.4f}\")\n",
    "    print('---------------------------------------')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "936dc677-4e66-46b2-b68f-3b34557f8fba",
   "metadata": {},
   "source": [
    "# 选择 随机森林模型，进行参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "455040b4-cafc-456b-814e-26f3162e7d7f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "【评估指标: r2】\n",
      "最佳参数: {'n_estimators': 500}\n",
      "最佳得分（验证集）: 0.8625559065739473\n",
      "测试集得分: 0.8624526835308357\n",
      "\n",
      "得分表:\n",
      "                  params  mean_test_score  std_test_score\n",
      "0   {'n_estimators': 10}         0.848459        0.013636\n",
      "1  {'n_estimators': 100}         0.860780        0.012077\n",
      "2  {'n_estimators': 500}         0.862556        0.012748\n",
      "\n",
      "------------------------------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X = df_train_data\n",
    "y = df_train_target\n",
    "\n",
    "# 拆分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n",
    "\n",
    "# 设置调参范围和评估指标\n",
    "tuned_parameters = [{'n_estimators': [10, 100, 500]}]\n",
    "scores = ['r2']\n",
    "\n",
    "for score in scores:\n",
    "    # 创建 GridSearchCV 实例\n",
    "    clf = GridSearchCV(RandomForestRegressor(), tuned_parameters, cv=5, scoring=score, n_jobs=-1)\n",
    "    \n",
    "    # 拟合训练数据\n",
    "    clf.fit(X_train, y_train)\n",
    "    \n",
    "    # 输出结果\n",
    "    print(f\"【评估指标: {score}】\")\n",
    "    print(\"最佳参数:\", clf.best_params_)\n",
    "    print(\"最佳得分（验证集）:\", clf.best_score_)\n",
    "    print(\"测试集得分:\", clf.score(X_test, y_test))\n",
    "    \n",
    "    # 打印详细结果表\n",
    "    print('\\n得分表:')\n",
    "    results_df = pd.DataFrame(clf.cv_results_)\n",
    "    print(results_df[['params', 'mean_test_score', 'std_test_score']])\n",
    "    print(\"\\n\" + \"-\" * 60 + \"\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "ee65c708-bcf2-4ad0-bfd2-b10081fdb1e1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 32 candidates, totalling 160 fits\n",
      "最佳参数: {'max_depth': None, 'min_samples_split': 2, 'n_estimators': 200}\n",
      "最佳 R² 得分（验证集）: 0.8617762049007043\n",
      "测试集 R² 得分: 0.8633667377698114\n",
      "测试集 MAE: 43.98702249770432\n",
      "测试集 MSE: 4539.7557192952245\n",
      "\n",
      "所有参数组合得分表：\n",
      "                                               params  mean_test_r2  \\\n",
      "0   {'max_depth': 2, 'min_samples_split': 2, 'n_es...      0.409205   \n",
      "1   {'max_depth': 2, 'min_samples_split': 2, 'n_es...      0.412400   \n",
      "2   {'max_depth': 2, 'min_samples_split': 2, 'n_es...      0.412911   \n",
      "3   {'max_depth': 2, 'min_samples_split': 2, 'n_es...      0.413332   \n",
      "4   {'max_depth': 2, 'min_samples_split': 4, 'n_es...      0.409205   \n",
      "5   {'max_depth': 2, 'min_samples_split': 4, 'n_es...      0.412400   \n",
      "6   {'max_depth': 2, 'min_samples_split': 4, 'n_es...      0.412911   \n",
      "7   {'max_depth': 2, 'min_samples_split': 4, 'n_es...      0.413332   \n",
      "8   {'max_depth': 4, 'min_samples_split': 2, 'n_es...      0.570717   \n",
      "9   {'max_depth': 4, 'min_samples_split': 2, 'n_es...      0.574795   \n",
      "10  {'max_depth': 4, 'min_samples_split': 2, 'n_es...      0.575244   \n",
      "11  {'max_depth': 4, 'min_samples_split': 2, 'n_es...      0.575166   \n",
      "12  {'max_depth': 4, 'min_samples_split': 4, 'n_es...      0.570717   \n",
      "13  {'max_depth': 4, 'min_samples_split': 4, 'n_es...      0.574795   \n",
      "14  {'max_depth': 4, 'min_samples_split': 4, 'n_es...      0.575244   \n",
      "15  {'max_depth': 4, 'min_samples_split': 4, 'n_es...      0.575166   \n",
      "16  {'max_depth': 6, 'min_samples_split': 2, 'n_es...      0.721684   \n",
      "17  {'max_depth': 6, 'min_samples_split': 2, 'n_es...      0.727000   \n",
      "18  {'max_depth': 6, 'min_samples_split': 2, 'n_es...      0.725858   \n",
      "19  {'max_depth': 6, 'min_samples_split': 2, 'n_es...      0.724729   \n",
      "20  {'max_depth': 6, 'min_samples_split': 4, 'n_es...      0.721674   \n",
      "21  {'max_depth': 6, 'min_samples_split': 4, 'n_es...      0.726995   \n",
      "22  {'max_depth': 6, 'min_samples_split': 4, 'n_es...      0.725848   \n",
      "23  {'max_depth': 6, 'min_samples_split': 4, 'n_es...      0.724710   \n",
      "24  {'max_depth': None, 'min_samples_split': 2, 'n...      0.848330   \n",
      "25  {'max_depth': None, 'min_samples_split': 2, 'n...      0.859781   \n",
      "26  {'max_depth': None, 'min_samples_split': 2, 'n...      0.861025   \n",
      "27  {'max_depth': None, 'min_samples_split': 2, 'n...      0.861776   \n",
      "28  {'max_depth': None, 'min_samples_split': 4, 'n...      0.847290   \n",
      "29  {'max_depth': None, 'min_samples_split': 4, 'n...      0.858728   \n",
      "30  {'max_depth': None, 'min_samples_split': 4, 'n...      0.860181   \n",
      "31  {'max_depth': None, 'min_samples_split': 4, 'n...      0.860828   \n",
      "\n",
      "    mean_test_mae  mean_test_mse  std_test_r2  \n",
      "0       97.258455   19291.815791     0.020968  \n",
      "1       97.070405   19188.315031     0.020361  \n",
      "2       97.026677   19171.333220     0.020106  \n",
      "3       97.008816   19158.885186     0.019175  \n",
      "4       97.258455   19291.815791     0.020968  \n",
      "5       97.070405   19188.315031     0.020361  \n",
      "6       97.026677   19171.333220     0.020106  \n",
      "7       97.008816   19158.885186     0.019175  \n",
      "8       78.991311   14015.900170     0.017513  \n",
      "9       78.537634   13884.633646     0.016819  \n",
      "10      78.445398   13869.349537     0.016505  \n",
      "11      78.437509   13873.447359     0.015662  \n",
      "12      78.991311   14015.900170     0.017513  \n",
      "13      78.537634   13884.633646     0.016819  \n",
      "14      78.445398   13869.349537     0.016505  \n",
      "15      78.437509   13873.447359     0.015662  \n",
      "16      62.832852    9083.621775     0.017037  \n",
      "17      62.209231    8914.818612     0.015061  \n",
      "18      62.295439    8952.717273     0.014307  \n",
      "19      62.414858    8990.828297     0.014277  \n",
      "20      62.835933    9083.958625     0.017041  \n",
      "21      62.210636    8914.970767     0.015062  \n",
      "22      62.297545    8953.043855     0.014308  \n",
      "23      62.418276    8991.448689     0.014272  \n",
      "24      46.175534    4942.769545     0.016326  \n",
      "25      44.730353    4569.731081     0.014504  \n",
      "26      44.616839    4528.633631     0.014334  \n",
      "27      44.492252    4504.563079     0.014094  \n",
      "28      46.249041    4974.937478     0.016629  \n",
      "29      44.932458    4604.135902     0.014577  \n",
      "30      44.801757    4556.197103     0.014200  \n",
      "31      44.711702    4535.525565     0.014049  \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24179 (\\N{CJK UNIFIED IDEOGRAPH-5E73}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 22343 (\\N{CJK UNIFIED IDEOGRAPH-5747}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24471 (\\N{CJK UNIFIED IDEOGRAPH-5F97}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 19981 (\\N{CJK UNIFIED IDEOGRAPH-4E0D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21516 (\\N{CJK UNIFIED IDEOGRAPH-540C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 19979 (\\N{CJK UNIFIED IDEOGRAPH-4E0B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 65288 (\\N{FULLWIDTH LEFT PARENTHESIS}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 39564 (\\N{CJK UNIFIED IDEOGRAPH-9A8C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 35777 (\\N{CJK UNIFIED IDEOGRAPH-8BC1}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 65289 (\\N{FULLWIDTH RIGHT PARENTHESIS}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIiCAYAAAD/4ZgUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA++UlEQVR4nO3de1zUdb7H8feAM+ANTE3UQOR4S6UsUQvMVkspSrucWi3O8VK66SEtZc1L5ormsesx3BIvW17astw2261dTLHybicldctMu2ikQqZuopIMwu/84YM5zYJ8Z2zgx8Tr+XjMg37f+f5+v8/vN/NF3n1/8xuHZVmWAAAAAAAXFGJ3AQAAAABQ2xGcAAAAAMCA4AQAAAAABgQnAAAAADAgOAEAAACAAcEJAAAAAAwITgAAAABgQHACAAAAAAOCEwAAAAAYEJwAAAhCmZmZSkpK0vXXX68rr7xSb7/9tt0lAcAvGsEJQJ21d+9eNWnSpMrHF1984XO/YPPZZ58pIyNDBw8erPDciBEj1LZt2xqvSZK2bt2qjIwM/fDDD7bsvzLTp0+v8vUfMGCAX/0uJCMjQw6Hw/NwOp1q06aNfvOb36igoMCr78CBA7V582Zt3LhRM2fO1JAhQ3T27NkLbnv48OFV1jZy5Mg62Q8AfEVwAlBnlZaWKj4+Xj/88EOlj/j4eJWWlvrcL9h89tlnmjlzZqXBafr06XrrrbdqviidD04zZ86sVcHpxx9/1LPPPlvp679jxw6dOnXKr34m7777rrZt26bVq1frnnvu0ZIlS3TjjTeqpKTE06d9+/YKCTn/z7jD4VC9evWq3OaZM2f05z//udLa/vznP+vMmTN1sh8A+Krq37IAgDqpXbt2dpcQcEVFRWrQoIHdZfgkISFBzZs3lyT1799fx44d09KlS7V582b169fPq29+fr7GjRunOXPmKDw83I5yAaBOYMYJAKrZ+vXr5XA49Nprr2natGlq3bq1IiIi1L9/f+3bt8/v7RUUFGj06NGKjo6Wy+VSXFycZs6cqXPnznn1W7Bggbp166ZGjRqpcePGuvzyy/Xoo49KkpYtW6Zf//rXkqR+/fp5Lg1btmyZpMov1XM4HBo7dqyWLl2qTp06qX79+urRo4c+/PBDWZalZ555RnFxcWrUqJFuuOEGffnll17r5+Tk6Pbbb1d0dLTCw8PVvn17jR49WseOHfP0ycjI0COPPCJJiouL89S1fv16SVJZWZmefvppXX755QoLC1OLFi00bNgwHTp0yGtfffv2VXx8vDZu3KikpCQ1aNBA999/vyTp/fffV9++fdWsWTPVr19fbdq00V133aWioiK/X4ua0qNHD0nSd99959V+/Phx3Xzzzbrzzjs1btw4O0oDgDqDGScAqCGPPvqoevfurRdffFGFhYWaPHmyBg0apL179yo0NNSnbRQUFKhXr14KCQnR7373O7Vr107btm3T7NmzdfDgQS1dulSS9PrrrystLU3jxo3Ts88+q5CQEH355Zf67LPPJEm33nqr5syZo0cffVTz589X9+7dJZlnmv72t79p586devLJJ+VwODR58mTdeuutGj58uL7++mu98MILOnnypNLT03XXXXdp165dcjgckqSvvvpKiYmJGjVqlCIjI3Xw4EHNnTtX1113nT755BM5nU6NGjVKJ06c0PPPP69Vq1apVatWkqQuXbpIkv7rv/5Lixcv1tixYzVw4EAdPHhQ06dP1/r16/Xxxx97Zmmk8zMx//mf/6lJkyZpzpw5CgkJ0cGDB3XrrbeqT58+WrJkiZo0aaLDhw/r3XffldvtrrUzUgcOHJAkdezY0dN27Ngx9e/fX8nJyXrmmWfsKg0A6gyCEwDUkC5duuiVV17xLIeGhmrw4MHavn27rr32Wp+2kZGRoX/+85/as2eP2rRpI0m68cYbVb9+fU2cOFGPPPKIunTpoi1btqhJkyb6/e9/71n3xhtv9Pz3pZdeqg4dOnjq8nX/xcXFWrt2rRo2bCjp/CzUHXfcoQ8++EAff/yxJyR9//33Gj9+vD799FNdccUVkqQxY8Z4tmNZlpKSktS3b1/FxsZq9erVuu222xQdHe05rquvvtpr1uvzzz/X4sWLlZaWpueff97TfvXVV+uaa67Rc889p//+7//2tJ84cUJvvPGGbrjhBk/bm2++qbNnz+qZZ55Rt27dPO2pqak+HX9NKS0t1blz53T69Gnl5ORowYIFuvfeez0BV5Iefvhh7d+/X02aNFHfvn0lSUuXLlVcXJxNVQPALxuX6gFADbntttu8lq+88kpJ0jfffOPzNv72t7+pX79+at26tc6dO+d5pKSkSJI2bNggSerVq5d++OEH3XvvvfrrX//qdTncz9GvXz9PaJKkzp07S5JSUlI8oemn7T89tqNHj2rMmDGKiYlRvXr15HQ6FRsbK+n8HQ5NPvjgA0nnLyP8qV69eqlz58567733vNovueQSr9AkSVdddZVcLpceeOABLV++XF9//bVxv3Zo2bKlnE6nLrnkEg0ePFgJCQlavny5V59XX31VRUVFWr9+vedBaAKA6kNwAoAa0qxZM6/lsLAwSefvxOar7777Tu+8846cTqfXo2vXrpLkCUhDhw7VkiVL9M033+iuu+5SixYtdM011ygnJ+dnHUPTpk29ll0uV5Xt5bfHLisrU3JyslatWqVJkybpvffe00cffaQPP/xQkm/n4Pjx45LkuXzvp1q3bu15vlxl/dq1a6d169apRYsWevDBB9WuXTu1a9dO8+bNM+6/Jq1bt07bt2/XmjVrdNddd2njxo18hgkAbMalegAQRJo3b64rr7zS65K0n2rdurXnv++77z7dd999OnPmjDZu3KgZM2Zo4MCB2r9/v2emp6Z8+umn2r17t5YtW6bhw4d72v/1BhJVKQ+e+fn5io6O9nruyJEjXp9vkuQ1A/ZTffr0UZ8+fVRaWqodO3bo+eef1/jx4xUVFaV77rnH53qqU7du3TzHM2DAAN10001avHixRo4cqZ49e9pcHQDUTcw4AUAQGThwoD799FO1a9dOPXr0qPD4aXAq17BhQ6WkpGjatGlyu93as2ePpIub8bpY5SGmfJ/lFi1aVKHvheoqv+zup58Tk6Tt27dr7969Xp/h8kVoaKiuueYazZ8/X5L08ccf+7V+TXE4HJo/f75CQ0P12GOP2V0OANRZzDgBQBCZNWuWcnJylJSUpIceekidOnXS2bNndfDgQWVnZ2vhwoWKjo7Wb37zG9WvX1+9e/dWq1atVFBQoCeeeEKRkZGeGYv4+HhJ0uLFi9W4cWOFh4crLi6uwiWFgXD55ZerXbt2mjJliizLUtOmTfXOO+9Ueulg+c0k5s2bp+HDh8vpdKpTp07q1KmTHnjgAT3//PMKCQlRSkqK5656MTExmjBhgrGOhQsX6v3339ett96qNm3a6OzZs1qyZImk89+XVFt16NBBDzzwgLKysrR582Zdd911dpcEAHUOM04AEERatWqlHTt2eG5BffPNN3s+z3TVVVfpkksukXT+crRPP/1UDz/8sAYMGKAJEyaoY8eO2rRpky699FJJ578nKTMzU7t3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cMMNVllZWZU1AABqFjNOAICAuvLKK72WW7VqpaNHj1a5Tm5urk6fPq1mzZqpUaNGnseBAwc8l82lp6dr1KhR6t+/v5588kmvy+kutr6oqChJ0hVXXOHVdvbsWRUWFkqSzpw5o0mTJqlLly5q0qSJGjVqpM8//9wz43Qhe/fuVe/evb3aevfurS+++EKlpaWeth49enj1GTFihHbt2qVOnTrpoYce0tq1ay/qOAEAgcXNIQAAAeV0Or2WHQ6HysrKqlynrKxMrVq10vr16ys8V363vIyMDKWmpurvf/+7Vq9erRkzZuj111/XnXfeedH1lX8eqbK28pofeeQRrVmzRs8++6zat2+v+vXr6+6775bb7a5yP5ZleX3eqbztXzVs2NBruXv37jpw4IBWr16tdevWafDgwerfv7/+/Oc/+3GUAIBAIzgBAGzXvXt3FRQUqF69elV+nqdjx47q2LGjJkyYoHvvvVdLly7VnXfeKZfL5TWLE0ibNm3SiBEjPAHt9OnTOnjwoFefyvbfpUsXbd682att69at6tixo0JDQ6vcZ0REhIYMGaIhQ4bo7rvv1s0336wTJ06oadOmP/+AAAAXhUv1AAC269+/vxITE3XHHXdozZo1OnjwoLZu3arHHntMO3bs0I8//qixY8dq/fr1+uabb7RlyxZt375dnTt3lnT+7nSnT5/We++9p2PHjqmoqChgtbVv316rVq3Srl27tHv3bqWmplaYQWvbtq02btyow4cP69ixY5Kk3/72t3rvvff0+OOPa//+/Vq+fLleeOGFKm9cIUnPPfecXn/9dX3++efav3+/3njjDbVs2bLS76kCANQcghMAwHYOh0PZ2dm6/vrrdf/996tjx4665557dPDgQUVFRSk0NFTHjx/XsGHD1LFjRw0ePFgpKSmaOXOmJCkpKUljxozRkCFDdOmll+rpp58OWG3PPfecLrnkEiUlJWnQoEG66aab1L17d68+s2bN0sGDB9WuXTvPd0d1795df/rTn/T6668rPj5ev/vd7zRr1iyNGDGiyv01atRITz31lHr06KGePXvq4MGDys7OVkgI/2QDgJ0cVmUXXAMAAAAAPPjfVwAAAABgQHACAFS7V1991es24z99dO3a1e7yAAAw4lI9AEC1O3XqlL777rtKn3M6nYqNja3higAA8A/BCQAAAAAMuFQPAAAAAAwITgAAAABgQHACAAAAAAOCEwAAAAAYEJwAAAAAwIDgBAAAAAAGBCcAAAAAMPg/hfOZvv8ARgoAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 19981 (\\N{CJK UNIFIED IDEOGRAPH-4E0D}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21516 (\\N{CJK UNIFIED IDEOGRAPH-540C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21644 (\\N{CJK UNIFIED IDEOGRAPH-548C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 32452 (\\N{CJK UNIFIED IDEOGRAPH-7EC4}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 21512 (\\N{CJK UNIFIED IDEOGRAPH-5408}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 19979 (\\N{CJK UNIFIED IDEOGRAPH-4E0B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 24471 (\\N{CJK UNIFIED IDEOGRAPH-5F97}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxEAAAIiCAYAAAC3/kXRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABbWUlEQVR4nO3deVxU1f/H8fcAsrghagKGIrmvqaCiuOZSlJVZaZprZlpqKeauudRXcslcvrmlppaaKblUtqBpai7lmoa5pIYZuCuuoHB/f/hzvjOxDIPAAL6e38d9PJpzzz3zmevolw+fc841GYZhCAAAAADSycnRAQAAAADIXUgiAAAAANiFJAIAAACAXUgiAAAAANiFJAIAAACAXUgiAAAAANiFJAIAAACAXUgiAAAAANiFJAIAAACAXVwcHQAAAMhcnTt31okTJ3T79m25u7tr9uzZqly5sqPDApCHUInAA+/QoUMqUqRImsfRo0fT3S+3iYqK0pgxY3Ty5Mlk57p166YyZcpke0yStG3bNo0ZM0aXL192yPunZNSoUWn++bds2dLRIWabMmXKqFu3bln6Hml9B8qUKaPWrVtnaNxmzZql+ec4duxYh/ZLTdOmTWUymcyHu7u7qlSpovfee08JCQlWfUeNGqWtW7dq586dqlmzpt544400xy5btmyasX3yySd29QOQ95FE4IGXmJioatWq6fLlyyke1apVU2JiYrr75TZRUVEaO3ZsiknEqFGjtGrVquwPSnd/gBw7dmyOSiJu3rypyZMnp/jnv2vXLl29etXRIeYpWfUduHr1qnbt2pXin+PkyZN18+ZNh/ZLyyOPPKLt27dr+/btWrFihcqXL69Ro0apb9++Vv0qVKhg/m+TySRnZ+c0x71y5YrOnz+fYmx9+/ZVfHy8Xf0A5H1MZwKQqrJlyzo6hEx348YN5c+f39FhABni4eGh4OBg8+vQ0FBVqVJFixYt0vTp0+Xu7m7V/8cff9S8efO0cePG7A4VQB5HJQLIJps2bZLJZNKyZcs0YsQIlSxZUoULF1aLFi10+PBhu8eLjY1Vr1695OfnJ1dXVwUEBGjs2LG6c+eOVb9Zs2bp0UcfVcGCBVWoUCFVqlRJw4cPlyQtXLhQL774oqS7Uy3uTZNYuHChpJSnM5lMJvXt21effPKJKlasKA8PDwUFBWnHjh0yDEOTJk1SQECAChYsqMcee0zHjh2zuj4yMlLPPvus/Pz85O7urnLlyqlXr146f/68uc+YMWM0aNAgSVJAQIA5rk2bNkmSkpKSNHHiRFWqVElubm4qUaKEunTpor///tvqvZo2bapq1app8+bNatCggfLnz69XXnlF0t0frpo2bapixYrJw8NDpUuX1vPPP68bN27Y/WeRXt26dVPBggX1xx9/6PHHH1eBAgXk6+ur999/X5K0Y8cONWzYUAUKFFCFChW0aNEiq+vPnTunN954Q1WqVFHBggVVokQJPfbYY9qyZYtVv/fff19OTk766quvkr1//vz5deDAgXTHfPv2bQ0ePFg+Pj7Knz+/GjZsqF9++SXFvun5Tp48eVImk0kTJ07Uf/7zH5UuXVru7u4KCgrShg0bzP1sfQfu+e6771S7dm15eHioUqVKWrBgQbo/W17g4uKimjVrKiEhIVnFZteuXWrXrp0WLFigOnXqOCZAAHkWlQggmw0fPlwhISGaN2+e4uLiNGTIED399NM6dOiQzSkH98TGxqpu3bpycnLSO++8o7Jly2r79u167733dPLkSfO85M8//1xvvPGG+vXrp8mTJ8vJyUnHjh1TVFSUJOmpp57S+PHjNXz4cH300UeqXbu2JNsViK+//lp79+7V+++/L5PJpCFDhuipp55S165ddfz4cf33v//VlStXFBYWpueff1779u2TyWSSJP3555+qX7++Xn31VXl6eurkyZOaMmWKGjZsqAMHDihfvnx69dVXdfHiRc2YMUNffvmlfH19JUlVqlSRJL3++uuaO3eu+vbtq9atW+vkyZMaNWqUNm3apD179qh48eLmWGNiYtSpUycNHjxY48ePl5OTk06ePKmnnnpKjRo10oIFC1SkSBGdPn1a3333nRISErK0UnH79m21bdtWvXv31qBBg7R06VINGzZMcXFxioiI0JAhQ+Tn56cZM2aoW7duqlatmgIDAyVJFy9elCSNHj1aPj4+unbtmlatWqWmTZtqw4YNatq0qSRpyJAh2rJli7p27aq9e/fK399fn3zyiRYtWqR58+apevXq6Y63Z8+eWrx4sd5++221bNlSBw8eVNu2bZNN3Urvd/Ke//73v/L399fUqVPNSWFoaKh++ukn8/cjre+AJO3fv18DBw7U0KFD5e3trXnz5qlHjx4qV66cGjdubPefTW514sQJFSlSRA899JC57ddff9XTTz+tuXPnqm3btg6MDkCeZQAPuAMHDhghISGpng8JCTEOHTqU7n6p2bhxoyHJePLJJ63av/jiC0OSsX379nTH3KtXL6NgwYLGX3/9ZdU+efJkQ5Lx+++/G4ZhGH379jWKFCmS5lgrVqwwJBkbN25Mdq5r166Gv7+/VZskw8fHx7h27Zq5bfXq1YYko2bNmkZSUpK5ferUqYYk47fffkvxvZOSkozbt28bf/31lyHJWLNmjfncpEmTDEnGiRMnrK45dOiQIcl44403rNp37txpSDKGDx9ubmvSpIkhydiwYYNV35UrVxqSjH379qUYV2oGDhxofPzxxymeO3r0qFGvXr00r+/atashyYiIiDC33b5923jooYcMScaePXvM7RcuXDCcnZ2NsLCwVMe7c+eOcfv2baN58+bGc889Z3Xu/Pnzhp+fn1G3bl1jz549Rv78+Y1OnTql52Oa3bvXAwYMsGpfsmSJIcno2rWruS2938kTJ04YkoySJUsaN2/eNPeLi4szihYtarRo0cLcltp3wDAMw9/f33B3d7d6v5s3bxpFixY1evXqlebnCgwMNI4ePZriuY8//tgYMmSIQ/ulpkmTJkbVqlWN27dvG7dv3zZiYmKMd955x5BkzJ4926pvyZIlDV9fX6NJkyZGkyZNjGeeeSbNsYsVK2bcvn07xXMjRowwZs2aZVc/AHkf05mAbPbMM89Yva5Ro4Yk6a+//kr3GF9//bWaNWumkiVL6s6dO+YjNDRUkvTTTz9JkurWravLly+rQ4cOWrNmjdWUofvRrFkzFShQwPz63taRoaGh5oqDZbvlZzt79qx69+6tUqVKycXFRfny5ZO/v7+kuztl2XJvbve/dwaqW7euKleubDUlRpK8vLz02GOPWbXVrFlTrq6ueu2117Ro0SIdP37c5vtmFpPJpCeffNL82sXFReXKlZOvr69q1aplbi9atKhKlCiR7Hsxe/Zs1a5dW+7u7ub7t2HDhmT3rlixYlq+fLn27NmjBg0aqHTp0po9e7Zdsd671y+//LJVe7t27eTiYl3ITu938p62bdtazd8vVKiQnn76aW3evDndGxTUrFlTpUuXNr92d3dXhQoV7Pq7lNv8/vvvypcvn/LlyydfX1+NGzdOw4YNU69evaz6nT59Wv/88482bdqkTZs2ac2a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",
      "text/plain": [
       "<Figure size 1000x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error, make_scorer\n",
    "\n",
    "# 假设 df_train_data 和 df_train_target 已定义\n",
    "# X = df_train_data\n",
    "# y = df_train_target\n",
    "\n",
    "# 拆分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n",
    "\n",
    "# 自定义评分函数\n",
    "scoring = {\n",
    "    'r2': 'r2',\n",
    "    'mae': make_scorer(mean_absolute_error),\n",
    "    'mse': make_scorer(mean_squared_error)\n",
    "}\n",
    "\n",
    "# 设置参数搜索空间\n",
    "param_grid = {\n",
    "    'n_estimators': [10, 50, 100, 200],\n",
    "    'max_depth': [2, 4, 6, None],\n",
    "    'min_samples_split': [2, 4]\n",
    "}\n",
    "\n",
    "# 创建 GridSearchCV\n",
    "grid_search = GridSearchCV(\n",
    "    estimator=RandomForestRegressor(random_state=0),\n",
    "    param_grid=param_grid,\n",
    "    scoring=scoring,\n",
    "    refit='r2',  # 以 R² 为最终优化目标\n",
    "    cv=5,\n",
    "    n_jobs=-1,\n",
    "    verbose=1\n",
    ")\n",
    "\n",
    "# 执行网格搜索\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# 获取最佳模型\n",
    "best_model = grid_search.best_estimator_\n",
    "\n",
    "# 输出最佳参数和得分\n",
    "print(\"最佳参数:\", grid_search.best_params_)\n",
    "print(\"最佳 R² 得分（验证集）:\", grid_search.best_score_)\n",
    "print(\"测试集 R² 得分:\", best_model.score(X_test, y_test))\n",
    "print(\"测试集 MAE:\", mean_absolute_error(y_test, best_model.predict(X_test)))\n",
    "print(\"测试集 MSE:\", mean_squared_error(y_test, best_model.predict(X_test)))\n",
    "\n",
    "# 转换为 DataFrame 查看所有结果\n",
    "results_df = pd.DataFrame(grid_search.cv_results_)\n",
    "print(\"\\n所有参数组合得分表：\")\n",
    "print(results_df[['params', 'mean_test_r2', 'mean_test_mae', 'mean_test_mse', 'std_test_r2']])\n",
    "\n",
    "# 添加参数列用于绘图\n",
    "results_df['n_estimators'] = results_df['params'].apply(lambda x: x['n_estimators'])\n",
    "results_df['max_depth'] = results_df['params'].apply(lambda x: x['max_depth'])\n",
    "\n",
    "# 可视化一：柱状图展示不同 n_estimators 下的表现（带误差线）\n",
    "grouped = results_df.groupby('n_estimators')[['mean_test_r2', 'std_test_r2']].agg(['mean', 'std']).reset_index()\n",
    "plt.figure(figsize=(10, 6))\n",
    "sns.barplot(\n",
    "    x='n_estimators',\n",
    "    y=('mean_test_r2', 'mean'),\n",
    "    data=grouped,\n",
    "    errorbar=lambda x: (x.mean(), x.std()),\n",
    "    capsize=0.1\n",
    ")\n",
    "plt.title('不同 n_estimators 下的 R² 得分（验证集）')\n",
    "plt.xlabel('n_estimators')\n",
    "plt.ylabel('平均 R² 得分')\n",
    "plt.grid(True)\n",
    "plt.show()\n",
    "\n",
    "# 可视化二：热力图展示 n_estimators 和 max_depth 的影响\n",
    "pivoted = results_df.pivot_table(index='param_n_estimators', columns='param_max_depth', values='mean_test_r2')\n",
    "plt.figure(figsize=(10, 6))\n",
    "sns.heatmap(pivoted, annot=True, cmap=\"YlGnBu\", fmt=\".3f\")\n",
    "plt.title('不同 n_estimators 和 max_depth 组合下的 R² 得分')\n",
    "plt.ylabel('n_estimators')\n",
    "plt.xlabel('max_depth')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "9334a183-3d05-4d01-9fcb-828b5087a9dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,\n",
    "                        n_jobs=1, train_sizes=np.linspace(0.1, 1.0, 5), scoring='r2'):\n",
    "    \"\"\"\n",
    "    画出模型的学习曲线\n",
    "    :param estimator: 模型对象\n",
    "    :param title: 图表标题\n",
    "    :param X: 输入特征\n",
    "    :param y: 目标值\n",
    "    :param ylim: y轴范围\n",
    "    :param cv: 交叉验证策略\n",
    "    :param n_jobs: 并行任务数\n",
    "    :param train_sizes: 训练集比例\n",
    "    :param scoring: 评估指标\n",
    "    \"\"\"\n",
    "    train_sizes, train_scores, test_scores = learning_curve(\n",
    "        estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes, scoring=scoring\n",
    "    )\n",
    "    \n",
    "    train_scores_mean = np.mean(train_scores, axis=1)\n",
    "    train_scores_std = np.std(train_scores, axis=1)\n",
    "    test_scores_mean = np.mean(test_scores, axis=1)\n",
    "    test_scores_std = np.std(test_scores, axis=1)\n",
    "\n",
    "    plt.figure()\n",
    "    plt.title(title)\n",
    "    if ylim is not None:\n",
    "        plt.ylim(*ylim)\n",
    "    plt.xlabel(\"Training examples\")\n",
    "    plt.ylabel(\"Score (%s)\" % scoring)\n",
    "\n",
    "    plt.grid()\n",
    "    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,\n",
    "                     train_scores_mean + train_scores_std, alpha=0.1, color=\"r\")\n",
    "    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,\n",
    "                     test_scores_mean + test_scores_std, alpha=0.1, color=\"g\")\n",
    "    plt.plot(train_sizes, train_scores_mean, 'o-', color=\"r\", label=\"Training score\")\n",
    "    plt.plot(train_sizes, test_scores_mean, 'o-', color=\"g\", label=\"Cross-validation score\")\n",
    "\n",
    "    plt.legend(loc=\"best\")\n",
    "    plt.show()\n",
    "\n",
    "    return plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2fca2220-b233-4644-959c-bae614747af0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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PDY2Fh07drS5TXR0NH7++Wc8evQIbm5uAIC///4bSqUSwcHBTxIKERERyVy+kqEVK1Zgzpw5OHDgAPz8/FCmTBk4Ozvj7t27uHTpEpycnPD666/j/fffR2hoaK77GzVqFHr27ImIiAhERkZiwYIFuHbtGgYPHgwgc4jr5s2b+OGHHwAAPXr0wCeffIK+ffti0qRJuH37Nt577z3069fP7gRqIiIiopzkORmqV68elEol+vTpg59++snqOkDp6enYt28fVq1ahYiICMydOxf/+9//ctznq6++ijt37mDy5MmIj49HWFgYNm7cKCVS8fHxuHbtmlTfzc0NsbGxGDZsGCIiIuDj44Nu3bphypQp+YmZiIiISJLnZOiTTz5B27Zt7a7X6XRo0qQJmjRpgilTpiAuLi5P+x0yZAiGDBlic92SJUusyqpVqyabWfRERERU+PKcDOWUCGXn6+sLX1/fJ2oQERERUVFy+L3JiIiIiBwp38nQ3Llz8fLLL6Nbt27Yvn27xbrbt2+jQoUKBdY4IiIiosKWr2Rozpw5eO+991CtWjXodDq0adPG4h5iRqMRV69eLfBGEhERERWWfJ1a/+2332LhwoXo0aMHgMzJz506dUJqaiomT55cKA0kIiIiKkz5Sobi4uIQFRUlLUdGRmL79u1o1qwZ9Ho9Ro4cWdDtIyIiIipU+UqGfH19cf36dZQrV04qq1mzJrZv346XXnoJN2/eLOj2ERERERWqfM0ZeuGFF7BmzRqr8ho1amDbtm3YtGlTgTWMiIiIqCjkq2do7NixOHz4sM11NWvWxI4dO/DLL78USMOIiIiIikK+kqHw8HDUqFEDkyZNQr9+/RASEmKxvmbNmqhZs2aBNpCIiIioMOX7OkNqtRrTp0+H0WgsjPYQERERFaknugL1yy+/jJ07dxZwU4iIiIiKXr6Gycxat26NcePG4dSpU6hfvz5cXV0t1nfo0KFAGkdERERU2J4oGXrrrbcAADNnzrRap1AoOIRGRERExcYTJUMmk6mg20FERETkELxrPREREclanpOhVatW5Xmn169fx59//vlEDSIiIiIqSnlOhubNm4dq1aph2rRpOHv2rNX6pKQkbNy4ET169ED9+vVx9+7dAm0oERERUWHI85yhXbt24bfffsPXX3+NDz74AK6urvD394eTkxPu3buHhIQElC5dGn379sWpU6fg5+dXmO0mIiIiKhD5mkDdrl07tGvXDnfu3MGePXtw5coVpKamwtfXF3Xr1kXdunWhVHIaEhERERUfT3Q2mY+PDzp27FjQbSEiIiIqcuzGISIiIlljMkRERESyxmSIiIiIZI3JEBEREcnaUyVDGRkZOH/+PAwGQ0G1h4iIiKhIPVEylJKSgv79+8PFxQU1a9bEtWvXAADDhw/H559/XqANJCIiIipMT5QMjRs3DsePH8fOnTvh5OQklb/88stYvXp1gTWOiIiIqLA90XWG1q1bh9WrV+P555+HQqGQymvUqIFLly4VWOOIiIiICtsT9Qz9+++/Nm+3kZycbJEcERERET3rnigZeu6557BhwwZp2ZwALVy4EJGRkQXTMiIiIqIi8ETDZFOnTkWrVq1w5swZGAwGzJ49G6dPn8a+ffuwa9eugm4jERERUaF5op6hqKgo7N27FykpKahYsSK2bNkCf39/7Nu3D/Xr1y/oNhIREREVmnz3DOn1egwcOBAfffQRli5dWhhtIiIiIioy+e4Z0mg0WLt2bWG0hYiIiKjIPdEwWefOnbFu3boCbgoRERFR0XuiCdSVKlXCJ598gr1796J+/fpwdXW1WD98+PACaRwRERFRYXuiZOi7776Dl5cXDh8+jMOHD1usUygUTIaIiIio2HiiZCguLq6g20FERETkEE9113oAEEJACFEQbSEiIiIqck+cDP3www+oVasWnJ2d4ezsjPDwcCxbtqwg20ZERERU6J5omGzmzJn46KOP8PbbbyM6OhpCCPz5558YPHgwbt++jXfeeaeg20lERERUKJ4oGfr6668xb9489OrVSyrr2LEjatasiYkTJzIZIiIiomLjiYbJ4uPjERUVZVUeFRWF+Pj4p24UERERUVF5omSoUqVK+Omnn6zKV69ejcqVKz91o4iIiIiKyhMNk02aNAmvvvoq/vjjD0RHR0OhUGDPnj3Ytm2bzSSJiIiI6Fn1RD1Dr7zyCvbv3w9fX1+sW7cOMTEx8PX1xYEDB9C5c+eCbiMRERFRoXminiEAqF+/PpYvX16QbSEiIiIqck/UM7Rx40Zs3rzZqnzz5s34/fffn7pRREREREXliZKhsWPHwmg0WpULITB27NinbhQRERFRUXmiZOjChQuoUaOGVXm1atVw8eLFp24UERERUVF5omTI09MTly9ftiq/ePEiXF1dn7pRREREREXliZKhDh06YOTIkbh06ZJUdvHiRYwePRodOnQosMYRERERFbYnSoamT58OV1dXVKtWDeXLl0f58uVRvXp1+Pj44MsvvyzoNhIREREVmic6td7T0xN79+5FbGwsjh8/Lt21vnHjxgXdPiIiIqJC9cTXGVIoFGjRogVatGhRkO0hIiIiKlL5Gibbv3+/1XWEfvjhB5QvXx5+fn4YOHAg0tPTC7SBRERERIUpX8nQxIkTceLECWn55MmT6N+/P15++WWMHTsW69evx9SpUwu8kURERESFJV/J0LFjx9CsWTNpedWqVWjYsCEWLlyIUaNGYc6cObxRKxERERUr+UqG7t27B39/f2l5165daNWqlbT83HPP4fr16wXXOiIiIqJClq9kyN/fH3FxcQCAjIwMHDlyBJGRkdL6hw8fQqPRFGwLiYiIiApRvpKhVq1aYezYsdi9ezfGjRsHFxcXNGrUSFp/4sQJVKxYscAbSURERFRY8pUMTZkyBSqVCi+++CIWLlyIhQsXQqvVSuu///77fJ9qP3fuXJQvXx5OTk6oX78+du/enaft/vzzT6jVatSpUydfxyMiIiLKKl/XGSpdujR2796NpKQkuLm5QaVSWaz/+eef4ebmluf9rV69GiNHjsTcuXMRHR2Nb7/9Fq1bt8aZM2dQtmxZu9slJSWhV69eaNasGf7555/8hEBERERk4Ylv1Jo9EQIAb29vi56i3MycORP9+/fHgAEDUL16dcyaNQshISGYN29ejtsNGjQIPXr0sJivRERERPQknvgK1E8rIyMDhw8fxtixYy3KW7Rogb1799rdbvHixbh06RKWL1+OKVOm5Hqc9PR0iwtBPnjwAACg1+uh1+ufsPX5Zz5WUR7TEeQQpxxiBBhnSSKHGAF5xCmHGAHbcRZmzA5Lhm7fvg2j0Whxqj6QecZaQkKCzW0uXLggTeBWq/PW9KlTp2LSpElW5Vu2bIGLi0v+G/6UYmNji/yYjiCHOOUQI8A4SxI5xAjII045xAhYxpmSklJox3FYMmSmUCgsloUQVmUAYDQa0aNHD0yaNAlVqlTJ8/7HjRuHUaNGScsPHjxASEgIWrRoAQ8PjydveD7p9XrExsaiefPmJfryA3KIUw4xAoyzJJFDjIA84pRDjIDtOM0jO4XBYcmQr68vVCqVVS9QYmKiVW8RkHkNo0OHDuHo0aN4++23AQAmkwlCCKjVamzZsgUvvfSS1XY6nQ46nc6qXKPROOSN5KjjFjU5xCmHGAHGWZLIIUZAHnHKIUbAMs7CjPeJJlAXBK1Wi/r161t19cXGxiIqKsqqvoeHB06ePIljx45Jj8GDB6Nq1ao4duwYGjZsWFRNJyIiohLEocNko0aNQs+ePREREYHIyEgsWLAA165dw+DBgwFkDnHdvHkTP/zwA5RKJcLCwiy29/Pzg5OTk1U5ERERUV45NBl69dVXcefOHUyePBnx8fEICwvDxo0bERoaCgCIj4/HtWvXHNlEIiIiKuEcPoF6yJAhGDJkiM11S5YsyXHbiRMnYuLEiQXfKCIiIpINh80ZIiIiInoWMBkiIiIiWWMyRERERLLGZIiIiIhkjckQERERyRqTISIiIpI1JkNEREQka0yGiIiISNaYDBEREZGsMRkiIiIiWWMyRERERLLGZIiIiIhkjckQERERyRqTISIiIpI1JkNEREQka0yGiIiISNaYDBEREZGsMRkiIiIiWWMyRERERLLGZIiIiIhkjckQERERyRqTISIiIpI1JkNEREQka0yGiIiISNaYDBEREZGsMRkiIiIiWWMyRERERLLGZIiIiIhkjckQERERyRqTISIiIpI1JkNEREQka0yGiIiISNaYDBEREZGsMRkiIiIiWWMyRERERLLGZIiIiIhkjckQERERyRqTISIiIpI1JkNEREQka0yGiIiISNaYDBEREZGsMRkiIiIiWWMyRERERLLGZIiIiIhkjckQERERyRqTISIiIpI1JkNEREQka0yGiIiISNaYDBEREZGsMRkiIiIiWWMyRERERLLGZIiIiIhkjckQERERyRqTISIiIpI1JkNEREQka0yGiIiISNaYDBEREZGsMRkiIiIiWWMyRERERLLGZIiIiIhkjckQERERyRqTISIiIpI1hydDc+fORfny5eHk5IT69etj9+7dduvGxMSgefPmKF26NDw8PBAZGYnNmzcXYWuJiIiopHFoMrR69WqMHDkS48ePx9GjR9GoUSO0bt0a165ds1n/jz/+QPPmzbFx40YcPnwYTZs2Rfv27XH06NEibjkRERGVFA5NhmbOnIn+/ftjwIABqF69OmbNmoWQkBDMmzfPZv1Zs2ZhzJgxeO6551C5cmV89tlnqFy5MtavX1/ELSciIqKSwmHJUEZGBg4fPowWLVpYlLdo0QJ79+7N0z5MJhMePnwIb2/vwmgiERERyYDaUQe+ffs2jEYj/P39Lcr9/f2RkJCQp33MmDEDycnJ6Natm9066enpSE9Pl5YfPHgAANDr9dDr9U/Q8idjPlZRHtMR5BCnHGIEGGdJIocYAXnEKYcYAdtxFmbMCiGEKLS95+DWrVsoU6YM9u7di8jISKn8008/xbJly3Du3Lkct1+5ciUGDBiA//u//8PLL79st97EiRMxadIkq/IVK1bAxcXlyQMgIiKiIpOSkoIePXogKSkJHh4eBbpvh/UM+fr6QqVSWfUCJSYmWvUWZbd69Wr0798fP//8c46JEACMGzcOo0aNkpYfPHiAkJAQtGjRosCfzJzo9XrExsaiefPm0Gg0RXbcoiaHOOUQI8A4SxI5xAjII045xAjYjtM8slMYHJYMabVa1K9fH7GxsejcubNUHhsbi44dO9rdbuXKlejXrx9WrlyJtm3b5nocnU4HnU5nVa7RaBzyRnLUcYuaHOKUQ4wA4yxJ5BAjII845RAjYBlnYcbrsGQIAEaNGoWePXsiIiICkZGRWLBgAa5du4bBgwcDyOzVuXnzJn744QcAmYlQr169MHv2bDz//PNSr5KzszM8PT0dFgcREREVXw5Nhl599VXcuXMHkydPRnx8PMLCwrBx40aEhoYCAOLj4y2uOfTtt9/CYDBg6NChGDp0qFTeu3dvLFmypKibT0RERCWAQ5MhABgyZAiGDBlic132BGfnzp2F3yAiIiKSFYffjoOIiIjIkZgMERERkawxGSIiIiJZYzJEREREssZkiIiIiGSNyRARERHJGpMhIiIikjUmQ0RERCRrTIaIiIhI1pgMERERkawxGSIiIiJZYzJEREREssZkiIiIiGTN4Xetf1YZjUbo9foC259er4darUZaWhqMRmOB7fdZI4c45RAjYD9OjUYDlUrlwJYRERUsJkPZCCGQkJCA+/fvF/h+AwICcP36dSgUigLd97NEDnHKIUYg5zi9vLwQEBBQouMnIvlgMpSNORHy8/ODi4tLgX3Ym0wmPHr0CG5ublAqS+7opBzilEOMgO04hRBISUlBYmIiACAwMNCRTSQiKhBMhrIwGo1SIuTj41Og+zaZTMjIyICTk1OJ/wIt6XHKIUbAfpzOzs4AgMTERPj5+XHIjIiKvZL7Sf4EzHOEXFxcHNwSomeb+XekIOfVERE5CpMhGzgPgihn/B0hopKEyRDZ1aRJE4wcOTLP9a9cuQKVSoWTJ08WXqOIiIgKGOcMFRajEdi9G4iPBwIDgejoQjtUbn+l9+7dG0uWLMn3fmNiYqDRaPJcPyQkBDdv3oRWq833sYiIiByFyVBhiIkBRowAbtyQihTBwdB89hnw+usFfrj4+Hjp59WrV+Pjjz/G+fPnpTLzhFczvV6fpyTH29s7X+1QqVQICAjAgwcP8rXdsy6vzxcRERVPHCYraDExQNeuFokQAODmTbj07p25voAFBARID09PTygUCmk5LS0NXl5e+Omnn9CkSRM4OTlh+fLluHPnDrp3747g4GC4uLigVq1aWLlypcV+sw+TlStXDp999hn69esHd3d3lC1bFgsWLJDWZx8m27lzJxQKBbZt24aIiAi4uLggKirKIlEDgClTpsDPzw/u7u4YMGAAxo4dizp16tiN9969e3j99ddRunRpODs7o3Llyli8eLG0/saNG3jttdfg7e0NV1dXREREYP/+/dL6efPmoWLFitBqtahatSqWLVtmsX+FQoH58+ejY8eOcHV1xZQpUwAA69evR/369eHi4oI6depg8uTJMBgMeXuRiIjomcVkKDdCAMnJeXs8eAAMH565TTaK/8oUI0dm1svL/mzs50m9//77GD58OM6ePYuWLVsiLS0N9evXx2+//YZTp05h4MCB6Nmzp0XSYMuMGTMQERGBo0ePYsiQIXjrrbdw7ty5HLcZP348ZsyYgUOHDkGtVqNfv37Suh9//BGffvoppk2bhsOHD6Ns2bKYN29ejvv76KOPcObMGfz+++84e/Ys5s2bB19fXwDAo0eP8OKLL+LWrVv49ddfcfz4cYwZMwYmkwkAsHbtWowYMQKjR4/GqVOnMGjQIPTt2xc7duywOMaECRPQsWNHnDx5Ev369cPmzZvxxhtvYPjw4Th16hS++uorLF26FJ9++mmObSUiomJAyExSUpIAIJKSkqzWpaamijNnzojU1NTHhY8eCZGZlhT949GjfMe3ePFi4enpKS3HxcUJAGLWrFm5btumTRsxevRoafnFF18UI0aMkJZDQ0PFG2+8IS2bTCbh5+cn5s2bZ3GsP/74QxiNRrFjxw4BQGzdulXaZsOGDQKA9Bw3bNhQDB061KId0dHR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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<module 'matplotlib.pyplot' from 'C:\\\\ProgramData\\\\anaconda3\\\\Lib\\\\site-packages\\\\matplotlib\\\\pyplot.py'>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# X = df_train_data\n",
    "# y = df_train_target\n",
    "\n",
    "# 定义交叉验证方式\n",
    "cv = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)\n",
    "\n",
    "# 定义模型\n",
    "estimator = RandomForestRegressor(n_estimators=200, random_state=0)\n",
    "\n",
    "# 绘制学习曲线\n",
    "plot_learning_curve(\n",
    "    estimator=estimator,\n",
    "    title=\"Learning Curves (Random Forest, n_estimators = 200)\",\n",
    "    X=X,\n",
    "    y=y,\n",
    "    ylim=(0.0, 1.01),\n",
    "    cv=cv,\n",
    "    n_jobs=-1,\n",
    "    train_sizes=np.linspace(0.1, 1.0, 5),\n",
    "    scoring='r2'  # 可选: 'neg_mean_squared_error', 'explained_variance', 等\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "29b2ef7d-4751-4918-904d-483be32d88b8",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
